javaweb读取 web 应用中的资源文件 |
您所在的位置:网站首页 › java web页面列出文件 › javaweb读取 web 应用中的资源文件 |
javaweb读取 web 应用中的资源文件 一、读取 web 应用中的资源文件(资源获取路径) 1、ServletContext获取资源 1.1 getRealPath package cn.ccnu.path; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* * ServletContext接口的getRealPath(Stringpath)方法 * 返回的是资源文件在服务器文件系统上的真实路径(带有盘符)。 * 参数path代表资源文件的虚拟路径,它应该以正斜线(/)开始,"/"表示当前web应用的根目录,也可以不以"/"开始。 */ public class ServletContextServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //当前资源:ServletContextServlet 和a.properties是在同一目录下的, // 即:都是类路径【\javaee\WEB-INF\classes】下的 // \javaee\WEB-INF\classes\cn\ccnu\path 下的同级文件 String path1 = this.getServletContext().getRealPath("/a.properties");//可以显示,但是路径错误 //路径错误的言外之意:a.properties文件的路径不是在:E:\apache-tomcat-7.0.73\webapps\javaee\a.properties //说明,我们写的方式存在问题!!!!!! String path2 = this.getServletContext().getRealPath("a.properties"); //可以显示,但是路径错误 (原因:与path1同) //正确: //原因:因为a.properties文件实在cn.ccnu.path包下的,而这些java包都是在src文件夹下的。 //而src文件夹下的文件,编译后,都是存放在 /WEB-INF/classes 目录下,所以,要显示出a.properties文件的正确路径, //应该把它所在的cn.ccnu.path写上,因为这样才是它的真实存放路径 String path3 = this.getServletContext().getRealPath("/WEB-INF/classes/cn/ccnu/path/a.properties"); String path4 = this.getServletContext().getRealPath("");//当前web应用的路径 String path5 = this.getServletContext().getRealPath("c.properties"); //可以显示,但是路径错误 (原因:与path1同) //不存在的文件演示path6 String path6 = this.getServletContext().getRealPath("2333333.txt");//错误 //无论你的文件存在还是不存在,他都会给你是显示出路径来,所以写路径时,应该注意,一定要真实存在的文件,然后写出它所在的正确路径 System.out.println(path1); // E:\apache-tomcat-7.0.73\webapps\javaee\a.properties System.out.println(path2); //输出的地址一样 // E:\apache-tomcat-7.0.73\webapps\javaee\a.properties System.out.println(path3); // E:\apache-tomcat-7.0.73\webapps\javaee\WEB-INF\classes\cn\ccnu\path\a.properties System.out.println(path4); // E:\apache-tomcat-7.0.73\webapps\javaee System.out.println(path5); // E:\apache-tomcat-7.0.73\webapps\javaee\c.properties System.out.println(path6); // E:\apache-tomcat-7.0.73\webapps\javaee\2333333.txt } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } 1.2 getResourceAsStream package cn.ccnu.path; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* * 但是,此处的用法是:以/开头的相对路径 ,此时的/代表web应用 默认从WebAPP根目录下取资源 */ public class ServletContextServlet2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // InputStream in = getServletContext().getResourceAsStream("/WEB-INF/classes/1.txt");//成功 // InputStream in = getServletContext().getResourceAsStream("a.properties");//失败 // InputStream in = getServletContext().getResourceAsStream("/cn/ccnu/path/a.properties");//失败 // InputStream in = getServletContext().getResourceAsStream("/a.properties");//失败 /* * 虽然,ServletContextServlet2和a.properties文件,都在/WEB-INF/classes/cn/ccnu/path/目录下, * 但是,此处的用法是:以/开头的相对路径 ,此时的/代表web应用 * 默认从WebAPP根目录下取资源 * * 疑惑1: ServletContext读取web应用中的资源文件 : * http://blog.csdn.net/chentiefeng521/article/details/57419954 * 疑惑2:Sax 中 getResourceAsStream 读取src目录下以及WEB-INF目录下的XML写法 * http://blog.csdn.net/fly_watermelon/article/details/50792979 */ InputStream in = getServletContext().getResourceAsStream("/WEB-INF/classes/cn/ccnu/path/a.properties"); // InputStream in = getServletContext().getResourceAsStream("/cn/ccnu/path/a.properties");//失败 byte[] buf = new byte[1024]; int len = 0; File f1 = new File("d://temp1//temp1");// 创建目录 if (!f1.exists()) { f1.mkdirs(); } File f11 = new File(f1, "temp.txt");// 创建文件 OutputStream out = new FileOutputStream(f11);// 方式1:成功读取 while ((len = in.read(buf)) != -1) { out.write(buf, 0, len); } System.out.println("成功222..............."); in.close(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } 1.3 总结 (1)ServletContext接口的getRealPath(Stringpath)方法返回的是资源文件在服务器文件系统上的真实路径(带有盘符)。 参数path代表资源文件的虚拟路径,它应该以正斜线(/)开始,“/“表示当前web应用的根目录,也可以不以“/“开始。 (2)ServletContext接口的getResouceAsStream(String path)方法可以获取path指定资源的流。 参数path代表资源文件的虚拟路径,它应该以正斜线(/)开始, “/“表示当前web应用的根目录,也可以不以“/“开始。 总之: 两种都是:“/“表示当前web应用的根目录,也可以不以“/“开始。
参考来源:ServletContext读取web应用中的资源文件 网址: http://blog.csdn.net/chentiefeng521/article/details/57419954 2、ClassLoader获取资源 2.1 getResourceAsStream方式 package cn.ccnu.classloaderpath; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* * ClassLoader类加载器不能通过绝对地址来加载资源,只能通过相对地址来加载资源 * 但相对地址不管前面加不加/都是相当于类路径的相对地址 * * 注意:ClassLoaderServlet 这个java类的类全名是:cn.ccnu.classloaderpath.ClassLoaderServlet * 在类路径类【/javaee/WEB-INF/classes】下的存放地址是:cn/ccnu/classloaderpath/ClassLoaderServlet * 即:类的报名中的每一个'.'都是路径'/'的形式 * */ public class ClassLoaderServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* * 加了/,其地址是相对于类路径的相对地址 【类路径,即:/javaee/WEB-INF/classes】 */ // InputStream in = this.getClass().getClassLoader().getResourceAsStream("/cn/ccnu/classloaderpath/c.properties"); // Properties prop = new Properties(); // prop.load(in); // System.out.println(prop.getProperty("url")); /* * 不加/,其地址是相对于类路径的相对地址 */ InputStream in = this.getClass().getClassLoader().getResourceAsStream("cn/ccnu/classloaderpath/c.properties"); Properties prop = new Properties(); prop.load(in); System.out.println(prop.getProperty("url")); /* * 总结:不能使用绝对地址,而只能只用相对地址 * 且不管加不加/的相对地址,都是相对于类路径的相对地址 * */ } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } 2.2 getResource方式 package cn.ccnu.classloaderpath; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ClassLoaderServlet2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //错误 // String path = ClassLoaderServlet.class.getClassLoader().getResource("c.properties").getPath(); // String path = ClassLoaderServlet.class.getClassLoader().getResource("/c.properties").getPath(); //正确: /* * ClassLoader类加载器不能通过绝对地址来加载资源,只能通过相对地址来加载资源 但相对地址不管前面加不加/都是相当于类路径【/javaee/WEB-INF/classes】的相对地址 */ String path = ClassLoaderServlet.class.getClassLoader(). getResource("cn/ccnu/classloaderpath/c.properties").getPath(); System.out.println("path:"+path); //path:/E:/apache-tomcat-7.0.73/webapps/javaee/WEB-INF/classes/cn/ccnu/classloaderpath/c.properties System.out.println("-------------------------------------------------------------"); System.out.println("resource:"+ClassLoaderServlet.class.getClassLoader().getResource("")); //读取资源的 URL 对象 // file:/E:/apache-tomcat-7.0.73/webapps/javaee/WEB-INF/classes/ System.out.println("-------------------------------------------------------------"); String path2 = ClassLoaderServlet.class.getClassLoader().getResource("").getPath(); //获取src资源文件编译后的路径(即classes路径) String path3 = this.getClass().getClassLoader().getResource("").getPath(); //获取src资源文件编译后的路径(即classes路径) System.out.println("path2:"+path2); System.out.println("path3:"+path3); /* * path2:/E:/apache-tomcat-7.0.73/webapps/javaee/WEB-INF/classes/ path3:/E:/apache-tomcat-7.0.73/webapps/javaee/WEB-INF/classes/ */ System.out.println("-------------------------------------------------------------"); String path4 = ClassLoaderServlet.class.getResource("").getPath(); System.out.println("path4:"+path4); //缺少类加载器,获取xxx类经编译后的xxx.class路径 // path4:/E:/apache-tomcat-7.0.73/webapps/javaee/WEB-INF/classes/cn/ccnu/classloaderpath/ System.out.println("-------------------------------------------------------------"); String path5 = request.getSession().getServletContext().getRealPath(""); System.out.println("path5:"+path5); //获取web项目的路径 // path5:E:\apache-tomcat-7.0.73\webapps\javaee } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } 2.3 总结(1)ClassLoader类加载器不能通过绝对地址来加载资源,只能通过相对地址来加载资源 。但相对地址不管前面加不加“/”都是相当于类路径【/javaee/WEB-INF/classes】的相对地址 (2) 1、xxx.class.getClassLoader().getResource(“”).getPath(); 获取src资源文件编译后的路径(即classes路径: eg: /E:/apache-tomcat-7.0.73/webapps/javaee/WEB-INF/classes/) 2、xxx.class.getClassLoader().getResource(“文件”).getPath(); 获取classes路径下“文件”的路径 3、this.getClass().getClassLoader().getResource(“”).getPath(); 以上两种方法的另外一种写法 4、特殊:xxx.class.getResource(“”).getPath(); 缺少类加载器,获取xxx类经编译后的xxx.class路径
参考来源:Javaclass.getClassLoader().getResource("")获取资源路径 网址:http://blog.csdn.net/ttx_laughing/article/details/52881452 3、Class获取资源 package cn.ccnu.classpath; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* * Class读取资源不能是绝对路径,只能是相对路径,又分为以/开头或者是不以/开头 * 1.以/开头的相对路径 ,此时的/代表类路径【类路径,即:/javaee/WEB-INF/classes】 * 2.不以/开头的相对路径 , 此时写的时候,相对的是当前资源文件所在的路径。 * eg:即(此处当前资源):/javaee/WEB-INF/classes/cn/ccnu/classpath */ public class ClassServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* * 1.以/开头的相对路径 * 此时的/代表类路径,即:/javaee/WEB-INF/classes */ // InputStream in = ClassServlet.class.getResourceAsStream("/cn/ccnu/classpath/b.properties"); // Properties porp = new Properties(); // porp.load(in); // System.out.println(porp.getProperty("url")); /* * 2.不以/开头的相对路径 * 相对的是当前资源文件所在的路径,此时相对的是:类ClassServlet.class的路径, * 即:\javaee\WEB-INF\classes\cn\ccnu\classpath (电脑下的路径写法) * 即:/javaee/WEB-INF/classes/cn/ccnu/classpath (java下的一种路径写法) */ InputStream in = ClassServlet.class.getResourceAsStream("b.properties"); Properties porp = new Properties(); porp.load(in); System.out.println(porp.getProperty("url")); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } 总结:Class读取资源不能是绝对路径,只能是相对路径,又分为以/开头或者是不以/开头 1.以/开头的相对路径 ,此时的/代表类路径【类路径,即:/javaee/WEB-INF/classes】 2.不以/开头的相对路径 , 此时写的时候,相对的是当前资源文件所在的路径。 eg:即(此处当前资源:src目录下的:cn.ccnu.classpath.ClassServlet) /javaee/WEB-INF/classes/cn/ccnu/classpath 二、servlet和el表达式中的一些路径写法 1、servlet中路径写法 //1.路径1 getContextPath()得到工程名 String contextPath = request.getContextPath(); //--路径:/Upload_download System.out.println("contextPath:"+contextPath);
//2.路径2 request.getSession().getServletContext().getContextPath() ServletContext servletContext2 =request.getSession().getServletContext(); //--路径:/Upload_download得到工程名 System.out.println("getContextPath2:"+servletContext2.getContextPath());
//3.路径3 getServletContext().getContextPath() ServletContext servletContext = this.getServletContext(); //--路径:/Upload_download得到工程名 System.out.println("getContextPath:"+servletContext.getContextPath());
//4.路径4 servletContext.getRealPath("/WEB-INF/info.txt") String realPath =servletContext.getRealPath("/WEB-INF/info.txt"); //--路径:E:\apache-tomcat-7.0.73\webapps\Upload_download\WEB-INF\info.txt System.out.println("realPath:"+realPath);
//5.路径5 getServletPath() //返回当前页面所在目录下全名称 String servletPath =request.getServletPath(); //路径:/upload System.out.println("servletPath:"+servletPath);
//6、返回包含工程名的当前页面全路径 String requestURI =request.getRequestURI(); //路径:/Upload_download/upload System.out.println("requestURI:"+requestURI);
//7、返回IE地址栏地址 StringBuffer requestURL =request.getRequestURL(); //路径:http://localhost:8080/Upload_download/upload System.out.println("requestURL:"+requestURL);
2、el表达式中路径写法 http://localhost:8080/test/success.jsp 等价于 ${pageContext.request.contextPath }/ test/success.jsp 说明:${pageContext.request.contextPath }作用:取出部署的应用程序名
三、web开发中 路径的写法小结 /* * web开发中 路径的写法小结 * * 你 每次写路径时,你自问 自, 你写路径是给谁 用的 ? * * 上来 先写个 /再说 . * * //给 浏览器 用的 ----- / ,那么 / 表示的是当前的主机名 * //给 web应用的 -----/ , 那么/ 表示当前 web应用的 根目录 */ public class PathSummaryServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
// 1. 转发的时候 ----给 web应用的 request.getRequestDispatcher("/servlet2").forward(request, response);
//2. 重定向的时候 ----给 浏览器用的 response.sendRedirect("/day11/1.html");
//3. 读取 web应用下资源文件的时候 ---在web应用根目录下有一个 1.txt文件 ----给 web应用的 getServletContext().getRealPath("/1.txt");
// 4. 表单提交数据的时候 ----给 浏览器用的 //
// 5. 超链接 a标签的时候 ----给 浏览器用的 //
// 6. 写了img 标签,src ----给 浏览器 用的 //
//7. url重写 ----给 浏览器 用的http://.../servlet;jsessionid=KSDFLKDSJFLKJDS response.encodeURL("/day11/servlet2");
// =========================================================
// 8. 使用类加载器获得文件的路径的时候 ----特殊
ClassLoader类加载器不能通过绝对地址来加载资源,只能通过相对地址来加载资源。但相对地址不管前面加不加/都是相当于类路径的相对地址 类路径:【/javaee/WEB-INF/classes】 备注:当前项目是:javaee (1)4.txt文件是src目录下的文件(2)6.jpg文件是src目录下的文件
(1)PathSummaryServlet.class.getClassLoader().getResource("4.txt") //获取src资源文件编译后的路径(即classes路径:/E:/apache-tomcat-7.0.73/webapps/javaee/WEB-INF/classes/4.txt)
(2) InputStream in = PathSummaryServlet.class.getClassLoader().getResourceAsStream("6.jpg"); //获取src资源文件编译后的路径(即classes路径:/E:/apache-tomcat-7.0.73/webapps/javaee/WEB-INF/classes/6.jpg)
(3) InputStream in2 = getServletContext().getResourceAsStream("/WEB-INF/classes/6.jpg"); ServletContext接口的getResouceAsStream(String path)方法可以获取path指定资源的流。 参数path代表资源文件的虚拟路径,它应该以正斜线(/)开始,“/”表示当前web应用的根目录,也可以不以“/”开始。
(4) PathSummayServlet.class.getResource("/4.txt"); //缺少类加载器,获取xxx类经编译后的xxx.class路径 即:关于src下的一个类:cn.ccnu.classloaderpath.ClassLoaderServlet
Stringpath4 = ClassLoaderServlet.class.getResource("").getPath(); System.out.println("path4:"+path4); path4:/E:/apache-tomcat-7.0.73/webapps/javaee/WEB-INF/classes/cn/ccnu/classloaderpath/
} 四、参考文章 1、文章1:Java class.getClassLoader().getResource("")获取资源路径 网址:http://blog.csdn.net/ttx_laughing/article/details/52881452 2、文章2:关于Class.getResource和ClassLoader.getResource的路径问题 网址:https://www.cnblogs.com/yejg1212/p/3270152.html 3、文章3:javaweb中路径的书写总结 网址:http://blog.csdn.net/bbb695480667/article/details/53838321 4、文章4:ServletContext读取web应用中的资源文件 网址:http://blog.csdn.net/chentiefeng521/article/details/57419954
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |